package com.mantisframework.core.utils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;

/**
 * 
 * 功能：将JDBC ResultSet里的值转化为List
 * 当实例存在时，返回实例集合，当实例不存在时，返回对象数组集合
 * 作者：马东东
 * 2010-11-11
 */
public class JDBCUtil{

	public static List<Object> transTurnList(ResultSet rs,Class<?> instance) throws SQLException, IllegalAccessException, InvocationTargetException, InstantiationException{
		 
		ResultSetMetaData metaData=rs.getMetaData(); //取得结果集的元元素
        int count=metaData.getColumnCount(); //取得所有列的个数
        Field[] fields={};
        if(instance!=null){
        	fields=instance.getDeclaredFields();//取得实例对象的属性
        }  
        //如果传入的对象当中没有属性
        if(fields.length<1){
        	List<Object> list=new ArrayList<Object>();
        	
          while(rs.next()){
        	  List<Object> arraylist=new ArrayList<Object>();
        	  for(int i=1;i<=count;i++){
        		  Object obj=rs.getObject(i);//取得列的值 
        		  arraylist.add(obj);
        	  }
        	  list.add(arraylist.toArray());//把arraylist转化成数组以后，放进list
          }	
          return list;   
          //返回对象数组集合
        }else{
        	//如果传入的对象当中有属性
        	 List<Object> list=new ArrayList<Object>();
        	while(rs.next()){
        		 Object newInstance=instance.newInstance();//构造业务对象实例
         	   for(int i=1;i<=count;i++){
                	Object obj=rs.getObject(i);//取得列的值           	
                	for(int j=0;j<fields.length;j++){
                		Field field=fields[j];//依次取出实例对象的属性
                		if(field.getName().equalsIgnoreCase(metaData.getColumnName(i).replaceAll("_",""))){
                  			BeanUtils.copyProperty(newInstance,field.getName(),obj);
                		}
                	}
                }  
         	   list.add(newInstance);
             }
        	//返回实例对象集合
        	return list;   
        }
	}
	
	public static Object transTurnObject(ResultSet rs,Class<?> instance) throws SQLException, IllegalAccessException, InvocationTargetException, InstantiationException{
		 
		ResultSetMetaData metaData=rs.getMetaData(); //取得结果集的元元素
        int count=metaData.getColumnCount(); //取得所有列的个数
        Field[] fields={};
        Object[] objs=new Object[count];
        
        if(instance!=null){
        	fields=instance.getDeclaredFields();//取得实例对象的属性
        }  
        
        if(fields.length<1){//如果传入的对象当中没有属性
        	  for(int i=1;i<=count;i++){
        		  objs[i-1]=rs.getObject(i);//取得列的值 
        	  }
         return objs;  	//返回对象数组 
        }else{
        	//如果传入的对象当中有属性
       	 Object obj=instance.newInstance();
         	   for(int i=1;i<=count;i++){
                	for(int j=0;j<fields.length;j++){
                		Field field=fields[j];//依次取出实例对象的属性
                		if(field.getName().equalsIgnoreCase(metaData.getColumnName(i).replaceAll("_",""))){
                  			BeanUtils.copyProperty(obj,field.getName(),rs.getObject(i));
                  			break;
                		}
                	}
               } 
         	  return obj;   //返回实例对象
        }
        	
    }
	
	
	
	
	
	
	
	
}
